import { app, BrowserWindow, ipcMain } from 'electron'
import { autoUpdater } from 'electron-updater'
// import { isString } from 'lodash'
import http from 'http'
import { is } from '@electron-toolkit/utils'
import path, { join } from 'path'
import logger from './core/logger'
import { WindowManager } from './core/window.manager'
import { title } from 'process'

autoUpdater.channel = 'latest'

console.log('app.getPath(name: string) ', app.getPath('temp'))
// 检测更新地址是否正确
const checkUpdateDomain = (updateDomain: string) => {
  logger.info(`检查更新服务器资源:${updateDomain}`)
  return new Promise((resolve) => {
    updateDomain += process.platform === 'win32' ? '/latest.yml' : '/latest-linux.yml'
    http
      .get(updateDomain, (res) => {
        const statusCode = res.statusCode || 500
        logger.info(`更新服务器资源状态：${statusCode} feedUrl: ${updateDomain}`)
        return [200, 201, 301, 302].includes(statusCode) ? resolve(1) : resolve(0)
      })
      .on('error', (err) => {
        logger.error(`http on-error: ${JSON.stringify(err)}`)
        resolve(0)
      })
  })
}

let updateWindow

export const checkForUpdates = async (domain: any = 'http://47.121.122.39', isDelData: any = 0) => {
  logger.info('checkForUpdates 检查更新开始')
  autoUpdater.forceDevUpdateConfig = false
  let hasUrl = await checkUpdateDomain(domain)
  if (!hasUrl) {
    logger.error('无法连接更新服务器')
    return
  }

  autoUpdater.setFeedURL({
    provider: 'generic',
    url: domain
  })
  autoUpdater.autoDownload = false // 自动下载,默认是ture
  // autoUpdater.forceDevUpdateConfig = app.isPackaged ? false : true

  // let wm = new WindowManager({
  //   title: '更新提示',
  // });
  // updateWindow = wm.showWindow('/updater')

  // setInterval(() => {
  //   updateWindow.webContents.send('update-percentage', {
  //     speed: '100',
  //     percent: 10
  //   })
  // }, 3000)

  // 当有可用更新的时候触发。 更新将自动下载
  autoUpdater.on('update-available', async function (message) {
    logger.debug('update-available', JSON.stringify(message))
    try {
      /* if (!fs.existsSync(lastDirectory)) {
        fs.mkdirSync(lastDirectory, { recursive: true })
      }
      if (fs.existsSync(sourceDirDb)) {
        await fs.promises.cp(sourceDirDb, lastDirectory, { recursive: true })
        // await fs.promises.rm(lastDirectory, { recursive: true, force: true })
      } */
      // Create the browser window.
      let wm = new WindowManager({
        title: '在线更新',
        titleBarStyle: 'hidden',
        resizable: false,
        modal: true,
        parentId: 1,
        width: 500,
        height: 220,
      });
      updateWindow = wm.showWindow('/updater')

      setInterval(() => {
        updateWindow.webContents.send('update-percentage', {
          speed: '100',
          percent: 10
        })
      }, 3000)
      autoUpdater.downloadUpdate()
    } catch (error) {
      logger.error(`back up error ${JSON.stringify(error)}`)
    }
  })

  // 当没有可用更新的时候触发。
  autoUpdater.on('update-not-available', function (message) {
    logger.debug('update-not-available', JSON.stringify(message))
  })

  // 当下载进度变化的时候触发
  autoUpdater.on('download-progress', function (prog) {
    let progress = {
      speed: Math.ceil(prog.bytesPerSecond / 1000), // 网速
      percent: Math.ceil(prog.percent) // 百分比
    }
    logger.info(`download-progress speed:${progress.speed} percent: ${Math.ceil(prog.percent)}`)
    // 发送下载进度到界面显示
    updateWindow?.webContents.send('update-percentage', progress)
  })

  // 在更新下载完成的时候触发,在 Windows 上只有 releaseName 是有效的。
  autoUpdater.on('update-downloaded', async (info) => {
    logger.debug('update-downloaded' + JSON.stringify(info))

    let timerDownLoaded
    timerDownLoaded = setTimeout(async () => {
      // 发送下载进度
      updateWindow?.webContents.send('update-percentage', {
        speed: '',
        percent: 100
      })

      // 如果需要删除数据则再次执行逻辑
      if (+isDelData === 1) {
        // 关闭数据库
        // 删除数据库文件夹及逻辑
      }
      // 解除限制，进行更新升级
      if (!is.dev) {
        autoUpdater.quitAndInstall(true, true) //下载完成后强制用户安装
        autoUpdater.removeAllListeners()
        logger.info('更新成功2000')
        clearTimeout(timerDownLoaded)
        app.exit()
      }
    }, 1000)
  })

  autoUpdater.on('error', function (message) {
    logger.error('error', JSON.stringify(message))
    autoUpdater.removeAllListeners()
  })

  autoUpdater.checkForUpdates()
}
